<!doctype html>



  


<html class="theme-next pisces use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.1.1" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="Hexo, NexT" />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.1.1" />






<meta name="description" content="基本概念1.操作系统中 heap堆 和 stack栈 的区别heap(堆):在运行期用来分配内存给对象和JRE Class，用来存储任何对象stack(栈):栈是线程执行存储局部变量，用来存局部变量，方法参数， 2.什么是基于注解的切面实现aspect切面:具体需要关注的那个类(spring-aop使用xml,或者注解方式@Aspect)joinpoint连接点:目标类连接点对象 Proceedi">
<meta property="og:type" content="article">
<meta property="og:title" content="技术问答">
<meta property="og:url" content="http://yoursite.com/2017/07/14/java/技术问答/index.html">
<meta property="og:site_name" content="Tissan">
<meta property="og:description" content="基本概念1.操作系统中 heap堆 和 stack栈 的区别heap(堆):在运行期用来分配内存给对象和JRE Class，用来存储任何对象stack(栈):栈是线程执行存储局部变量，用来存局部变量，方法参数， 2.什么是基于注解的切面实现aspect切面:具体需要关注的那个类(spring-aop使用xml,或者注解方式@Aspect)joinpoint连接点:目标类连接点对象 Proceedi">
<meta property="og:image" content="http://yoursite.com/uploads/java/blocking-queue.png">
<meta property="og:updated_time" content="2017-12-05T13:05:46.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="技术问答">
<meta name="twitter:description" content="基本概念1.操作系统中 heap堆 和 stack栈 的区别heap(堆):在运行期用来分配内存给对象和JRE Class，用来存储任何对象stack(栈):栈是线程执行存储局部变量，用来存局部变量，方法参数， 2.什么是基于注解的切面实现aspect切面:具体需要关注的那个类(spring-aop使用xml,或者注解方式@Aspect)joinpoint连接点:目标类连接点对象 Proceedi">
<meta name="twitter:image" content="http://yoursite.com/uploads/java/blocking-queue.png">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Pisces',
    sidebar: {"position":"left","display":"post","offset":12,"offset_float":0,"b2t":false,"scrollpercent":false},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 'undefined',
      author: 'Java程序员'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://yoursite.com/2017/07/14/java/技术问答/"/>





  <title>技术问答 | Tissan</title>
  














</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">Tissan</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/2017/07/14/java/技术问答/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="罗天翔">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/uploads/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Tissan">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">技术问答</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2017-07-14T21:12:09+08:00">
                2017-07-14
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/java/" itemprop="url" rel="index">
                    <span itemprop="name">java</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-comment-o"></i>
              </span>
              
                <a href="/2017/07/14/java/技术问答/#SOHUCS" itemprop="discussionUrl">
                  <span id="changyan_count_unit" class="post-comments-count hc-comment-count" data-xid="2017/07/14/java/技术问答/" itemprop="commentsCount"></span>
                </a>
              
            
          

          
          
             <span id="/2017/07/14/java/技术问答/" class="leancloud_visitors" data-flag-title="技术问答">
               <span class="post-meta-divider">|</span>
               <span class="post-meta-item-icon">
                 <i class="fa fa-eye"></i>
               </span>
               
                 <span class="post-meta-item-text">阅读次数 </span>
               
                 <span class="leancloud-visitors-count"></span>
             </span>
          

          

          

          

        </div>
      </header>
    

    <div class="post-body" itemprop="articleBody">

      
      

      
        <h3 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h3><p>1.操作系统中 heap堆 和 stack栈 的区别<br>heap(堆):在运行期用来分配内存给对象和JRE Class，用来存储任何对象<br>stack(栈):栈是线程执行存储局部变量，用来存局部变量，方法参数，</p>
<p>2.什么是基于注解的切面实现<br>aspect切面:具体需要关注的那个类(spring-aop使用xml,或者注解方式@Aspect)<br>joinpoint连接点:目标类连接点对象 ProceedingJoinPoint能拿到调用方法所用的参数，方法名等<br>pointcut切入点:execution(<em> com.spring.service.</em>.*(..))具体的某个方法,pointcut决定joinpoint去获取哪个地方执行<br>advice通知:对某个类中所有方法进行日志记录<br>introduction:给target引入新的接口<br>weave织入: 创建目标类的代理类，这个目标代理类和目标类有着相同的接口方法<br>Around advice(日志处理，事务处理)</p>
<p>3.什么是 对象/关系 映射集成模块<br>spring orm模块,关系数据库和对象之间的映射</p>
<p>4.什么是 Java 的反射机制<br>通过反射可以拿到运行期对象的属性，方法</p>
<p>5.什么是 ACID<br>Atomic:原子性 行为不可分割<br>Consistency:一致性<br>Isolation:隔离性<br>Durability:持久性</p>
<p>6.隔离机制<br>读未提交:读取未提交的造成脏读<br>读已提交:读同一条值结果不一样造成不可重复读<br>可重复读:对同一条记录，但是会幻读(新增/删除其他记录无法避免)<br>串行:锁表</p>
<p>7.Cookie 和 Session的区别<br>http无状态所以需要</p>
<p>8.fail-fast 与 fail-safe 机制有什么区别<br>fail-fast:当一个线程在iterator集合时，另外有线程修改了集合个数,引用对象地址没修改就没关系<br>fail-safe:对集合结构的修改都会在复制结合上操作，无法保证读取的数据是原始数据</p>
<p>9.get 和 post请求的区别<br>get:查询服务器资源,get请求大小有限制 2k,<br>post:修改服务器资源的请求,post更安全，因为浏览器直接记录get请求的明文数据</p>
<p>10.form-data 与 x-www-form-urlencoded 的区别<br>form-data:可以上传文件<br>x-www-form-urlencoded:将表单内的数据转换为键值对<br>octet-stream:只能上传单个文件</p>
<p>11.IOC(Inversion Of Controller)的优点是什么<br>将javabean的实例化都交给容器去做，而不是传统的在对象内部实例，以便解耦<br>bean的实例化靠注入来实现</p>
<p>12.IO 和 NIO的区别，NIO优点<br>IO(阻塞IO):每次从流中读取一个多个字节，直接流被读取完<br>NIO(非阻塞IO):面向缓冲区，一个线程从某通道发送数据读取请求，如果当前没有可用的数据就什么也不获取，而不是阻塞，该线程可以做其他事情<br>             所以一个线程可以管理多个输入输出通道<br>selectors:允许一个线程观察使用selector观察多个通道</p>
<p>13.Java 8 / Java 7 为我们提供了什么新功能<br>Java8:LongAddr,DoubleAddr:对象中包含多个变量，然后求这组变量的sum<br>LongAdder的add方法:<br>动态管理cells的数量,每个线程分配到cell[]中,对cell进行加操作，防止对同一个字段加操作时失败率大</p>
<p>14.qps统计<br>锁和CAS区别在于，锁是消耗性能的，cas在大量的并发情况下失败非常多也会影响性能<br>计算qps使用LongAddr</p>
<p>15.什么是竞态条件？ 举个例子说明。<br>这种条件能够在并发的情况下，错误的执行顺序，能够造成不同的执行结果</p>
<p>16.如何分析Java线程dumps</p>
<p>17.JRE、JDK、JVM 及 JIT 之间有什么不同<br>jre基础包<br>jdk:包括jre，运行环境jvm，开发工具<br>jvm:程序的运行环境<br>JIT:即时编译 虚拟机发现某个方法运行的特别频繁就会把代码认定为热点代码<br>Javac:将java文件转化为class文件</p>
<p>18.RPC 通信和 RMI 区别</p>
<table>
<thead>
<tr>
<th>rpc</th>
<th>rmi</th>
<th>webservice</th>
</tr>
</thead>
<tbody>
<tr>
<td>通过网络一些向远程主机发送请求，带有参数，通常使用interface.method形式</td>
<td>只适用于Java，通过使用对象的客户端代理作为调用远程服务的接口，每个远程方法都有签名，采用tcp/ip协议，强类型</td>
<td>基于web容器底层使用http协议</td>
</tr>
</tbody>
</table>
<blockquote>
<p>使用动态代理是：把目标类封装成代理类，但是实际上里面的代码是远程方法调用socket连接</p>
</blockquote>
<p>19.WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。<br>tomcat</p>
<p>20.一个”.java”源文件中是否可以包含多个类（不是内部类）？有什么限制<br>只能有一个public，而且这个public类名是文件名</p>
<p>21.简单说说你了解的类加载器。是否实现过类加载器<br>BootStrap ClassLoader:rt.jar里面的<br>Extension ClassLoader:jre/lib/ext/下的jar<br>App ClassLoader:加载应用classpath下的所有jar，class文件</p>
<p>22.reponse 下载文件<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">response.setContentType(<span class="string">"application/octet-stream:charset="</span>);</div><div class="line">response.setHeader(<span class="string">"Content-Disposition"</span>, <span class="string">"attachment; filename="</span>);</div><div class="line">response.setCharacterEncoding(<span class="string">"UTF-8"</span>);</div></pre></td></tr></table></figure></p>
<p>23.请简述 Servlet 的生命周期及其相关的方法<br>init()<br>service()<br>destory()<br>作用域<br>page<br>request<br>session<br>application</p>
<p>24.短链服务<br><a href="https://www.zhihu.com/question/29270034" target="_blank" rel="external">https://www.zhihu.com/question/29270034</a></p>
<p>24.nginx</p>
<p>27.redis<br><a href="http://redisdoc.com/" target="_blank" rel="external">http://redisdoc.com/</a></p>
<p>28.长连接</p>
<p>请简述一下 Ajax 的原理及实现步骤<br>什么是 N 层架构</p>
<p>什么是正则表达式？用途是什么？哪个包使用正则表达式来实现模式匹配</p>
<p>什么是尾递归，为什么需要尾递归<br><a href="https://www.zhihu.com/question/20761771" target="_blank" rel="external">https://www.zhihu.com/question/20761771</a><br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//尾递归</span></div><div class="line"><span class="function">function <span class="title">f</span><span class="params">(x)</span> </span>&#123;</div><div class="line">   <span class="keyword">if</span> (x == <span class="number">1</span>) <span class="keyword">return</span> <span class="number">1</span>;</div><div class="line">   <span class="keyword">return</span> f(x-<span class="number">1</span>);</div><div class="line">&#125;</div><div class="line"><span class="comment">//非尾递归</span></div><div class="line"><span class="function">function <span class="title">f</span><span class="params">(x)</span> </span>&#123;</div><div class="line">   <span class="keyword">if</span> (x == <span class="number">1</span>) <span class="keyword">return</span> <span class="number">1</span>;</div><div class="line">   <span class="keyword">return</span> <span class="number">1</span> + f(x-<span class="number">1</span>);</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<h4 id="面试题"><a href="#面试题" class="headerlink" title="面试题"></a>面试题</h4><p><a href="https://dongchuan.gitbooks.io/java-interview-question/java/final,_finally,_finalize.html" target="_blank" rel="external">https://dongchuan.gitbooks.io/java-interview-question/java/final,_finally,_finalize.html</a></p>
<h3 id="关键字"><a href="#关键字" class="headerlink" title="关键字"></a>关键字</h3><p>1.finalize()方法什么时候被调用<br>当这个对象没有被引用时，gc决定回收他所调用的方法</p>
<p>2.final关键字有哪些用法<br>声明属性:不能引用新对象<br>方法:不能被覆盖<br>类:不能被继承</p>
<p>4.使用final关键字修饰一个变量时，是引用不能变，还是引用的对象的地址不能变</p>
<p>5.Java 有几种修饰符？分别用来修饰什么<br>方法中修饰符:public,private,protected,static,synchronized,native<br>成员变量:public,private,protected,friendly,final,static,transient,volatile<br>类修饰符:public,abstract,final,friendly</p>
<p>6.volatile 修饰符的有过什么实践<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">boolean</span> keepRunning = <span class="keyword">true</span>;</div><div class="line"></div><div class="line"><span class="meta">@Override</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>&#123;</div><div class="line">    <span class="keyword">while</span> (keepRunning) &#123;</div><div class="line">        <span class="comment">//一直运行即时keepRunning已经在主存中为false</span></div><div class="line">    &#125;</div><div class="line"></div><div class="line">    System.out.println(<span class="string">"Thread terminated."</span>);</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> InterruptedException </span>&#123;</div><div class="line">    ShortenController t = <span class="keyword">new</span> ShortenController();</div><div class="line">    t.start();</div><div class="line">    Thread.sleep(<span class="number">1000</span>);</div><div class="line">    t.keepRunning = <span class="keyword">false</span>;</div><div class="line">    System.out.println(<span class="string">"keepRunning set to false."</span>);</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>7.volatile 变量是什么？volatile 变量和 atomic 变量有什么不同<br>volatile是<br>atomic保证数据是原子性操作<br>volatile保证的是线程使用数据每次都是从主存中获取的</p>
<p>8.volatile 类型变量提供什么保证？能使得一个非原子操作变成原子操作吗<br>volatile只能保证读的可见性</p>
<p>9.能创建 volatile 数组吗？<br>可以创建，并且可见性依旧生效</p>
<p>10.transient变量有什么特点<br>防止数据序列化</p>
<p>11.请说出作用域public, private, protected, 以及不写时的区别<br>default:包访问权限</p>
<p>12.static class 与 non static class的区别<br>只有内部类可以为static</p>
<p>13.main() 方法为什么必须是静态的？能不能声明 main() 方法为非静态</p>
<p>14.静态变量在什么时候加载？编译期还是运行期？静态代码块加载的时机呢</p>
<p>15.switch 语句中的表达式可以是什么类型数据<br>可以:<br>char byte short  int<br>enum String<br>Character Byte Short Integer<br>不可以: long</p>
<h3 id="操作符"><a href="#操作符" class="headerlink" title="操作符"></a>操作符</h3><p>16.&amp;操作符和&amp;&amp;操作符有什么区别?<br>&amp; 位操作<br>&amp;&amp; 与</p>
<ol>
<li><p>a = a + b 与 a += b 的区别？</p>
</li>
<li><p>逻辑操作符 (&amp;,|,^)与条件操作符(&amp;&amp;,||)的区别</p>
</li>
<li><p>3*0.1 == 0.3 将会返回什么？true 还是 false？<br><a href="https://segmentfault.com/q/1010000000137297" target="_blank" rel="external">https://segmentfault.com/q/1010000000137297</a></p>
</li>
</ol>
<p>20.float f=3.4; 是否正确？<br>不正确 double d = 3.4; 默认 float f = 3.4f;</p>
<p>21.short s1 = 1; s1 = s1 + 1;有什么错?<br>int 强转成short报错</p>
<h3 id="数据结构"><a href="#数据结构" class="headerlink" title="数据结构"></a>数据结构</h3><p>1.int 和 Integer 哪个会占用更多的内存？ int 和 Integer 有什么区别？parseInt()函数在什么时候使用到</p>
<p>2.float和double的默认值是多少<br>float 单精度（16位）<br>double 双进度（7位）</p>
<p>3.如何去小数四舍五入保留小数点后两位<br>BigDemical.setScale(3.45,2,RoundingMode.HalfUP)</p>
<p>4.char 型变量中能不能存贮一个中文汉字，为什么<br>中文 2个字节</p>
<p>5.进制转换<br>怎样将 bytes 转换为 long 类型<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">byte</span>[] arr = <span class="keyword">new</span> <span class="keyword">byte</span>[]&#123;<span class="string">'1'</span>,<span class="string">'2'</span>&#125;;</div><div class="line">        <span class="keyword">char</span>[] c = <span class="keyword">new</span> <span class="keyword">char</span>[arr.length];</div><div class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; arr.length; i++) &#123;</div><div class="line">            c[i] = (<span class="keyword">char</span>) arr[i];</div><div class="line">        &#125;</div><div class="line">String s = <span class="keyword">new</span> String(c);</div></pre></td></tr></table></figure></p>
<p>我们能将 int 强制转换为 byte 类型的变量吗？如果该值大于 byte 类型的范围，将会出现什么现象<br>(1)byte是1个字节，8位，2^8=256，-128~127 超过前面24位会丢失<br>能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗<br>(1)Double.valueOf(3.3).longValue();<br>类型向下转换是什么<br>(1)<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">A a = <span class="keyword">new</span> A();</div><div class="line">B b = (B)a;<span class="comment">//报错</span></div><div class="line"></div><div class="line">A a = <span class="keyword">new</span> B();</div><div class="line">B b = (B)a;</div><div class="line"></div><div class="line">B b = <span class="keyword">new</span> B();</div><div class="line">A a = (A)b;</div></pre></td></tr></table></figure></p>
<p>6.编码格式<br>utf-8:程序按一个字节一个字节读出来，然后根据字节的开头的bit标志来识别是把一个，两个还是三个字节作为一个单元来解析<br>utf-16:都有两个字节来保存，但是英文只要一个字节所以很浪费就有utf-8<br>中国:<br>gb2312:只能存放简体中文字符<br>gbk:国家标准扩展<br>GB18030:一二四字节变长编，比gbk词汇更多</p>
<p>Unicode:包含所有中文，德文，英语所有语言的字符都作为一个特殊的unicode编码 A:U+0041<br>ASCII:表示字符的编码规范，每个字符站用1字节，只包括表示英文，字符的规范: A:65</p>
<p>7.怎么打印数组？ 怎样打印数组中的重复元素<br>Arrays.toString(arr)</p>
<p>8.Array 和 ArrayList有什么区别？什么时候应该使用Array而不是ArrayList<br>Array能包括对象类型和基本类型，只能是同种类型的，需要提前申请好大小<br>ArrayList能包括对象类型，可以是不同类型，动态增长，设置初始大小不是limit</p>
<p>9.数组有没有length()这个方法? String有没有length()这个方法<br>数组是length属性<br>String是length()</p>
<p>10.队列和栈是什么，列出它们的区别<br>栈只能在一端进行插入和删除，先进先出<br>队列先进后出</p>
<p>11.BlockingQueue是什么(线程安全，内部锁)<br>(1)方法<br>E poll<br>void put：<br>boolean offer:插入成功返回true，可以指定等待时间，超时时间<br>boolean remove<br><img src="/uploads/java/blocking-queue.png" alt="结果"></p>
<p>(2)实现类<br>ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue</p>
<p>(3)简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。<br>ConcurrentLinkedQueue：非阻塞队列<br>LinkedBlockingQueue：阻塞队列<br>并行：两个cpu都是在做相同的事情<br>并发：两者交替轮流使用资源，单核cpu切换</p>
<table>
<thead>
<tr>
<th>LinkedBlockingQueue</th>
<th>ConcurrentLinkedQueue</th>
</tr>
</thead>
<tbody>
<tr>
<td>线程安全，最大容量:Integer.MAX_VALUE，当队列满的时候队列会阻塞直至队列成员被消费,put，take被阻塞</td>
<td>ConcurrentLinkedQueue基于链接节点的无界安全队列，采用CAS操作来保证元素的一致性</td>
</tr>
</tbody>
</table>
<p>ArrayList、Vector、LinkedList的存储性能和特性<br>(1)ArrayList,Vector都是数组方式储存<br>(2)LinkedList实现了Queue接口，还支持put peek</p>
<p>ByteBuffer 与 StringBuffer有什么区别<br>(1)ByteBuffer nio包<br>(2)StringBuffer<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//分配大小</span></div><div class="line">ByteBuffer buffer=ByteBuffer.allocate(<span class="number">256</span>);</div><div class="line">String sendString=<span class="string">"sendStr"</span>;</div><div class="line">ByteBuffer sendBuffer=ByteBuffer.wrap(sendString.getBytes(<span class="string">"UTF-8"</span>));</div></pre></td></tr></table></figure></p>
<p>HashMap<br>(1)HashMap可以接受null键和null值<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">Entry</span>&lt;<span class="title">K</span>,<span class="title">V</span>&gt; <span class="keyword">implements</span> <span class="title">Map</span>.<span class="title">Entry</span>&lt;<span class="title">K</span>,<span class="title">V</span>&gt; </span>&#123;</div><div class="line">        <span class="keyword">final</span> K key; <span class="comment">//Entry不为空</span></div><div class="line">        V value;</div><div class="line">        Entry&lt;K,V&gt; next;</div><div class="line">        <span class="keyword">final</span> <span class="keyword">int</span> hash;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">if</span> (key == <span class="keyword">null</span>) <span class="keyword">return</span> putForNullKey(value);</div><div class="line"></div><div class="line">hash=<span class="number">0</span></div><div class="line"><span class="keyword">null</span>放在table[<span class="number">0</span>]中</div><div class="line">map.put(<span class="keyword">null</span>,<span class="keyword">null</span>);</div><div class="line">map.put(<span class="keyword">null</span>,<span class="number">25</span>);<span class="comment">//直接将Entry取出，然后替换value</span></div><div class="line">map.get(<span class="keyword">null</span>);getForNullKey()</div><div class="line">capacity=<span class="number">16</span></div><div class="line">loadFactor=<span class="number">0.75</span></div><div class="line">threshold=<span class="number">12</span></div><div class="line"></div><div class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">int</span> <span class="title">indexFor</span><span class="params">(<span class="keyword">int</span> h, <span class="keyword">int</span> length)</span> </span>&#123;</div><div class="line">        <span class="comment">// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";</span></div><div class="line">        <span class="keyword">return</span> h &amp; (length-<span class="number">1</span>);</div><div class="line">&#125;</div><div class="line"><span class="keyword">if</span> (e.hash == hash &amp;&amp; ((k = e.key) == key || (key != <span class="keyword">null</span> &amp;&amp; key.equals(k))))</div></pre></td></tr></table></figure></p>
<p>(2)HashMap的工作原理是什么<br>put:先调用key的hashcode方法，然后找到具体的table，然后一个一个比较hashcode是否相同equals是否相同，如果不相同就插入一个，如果有相同的，就替换value<br>get:想找到table，然后根据equals和hash同时判断，如果有相同的就找出<br>resize:当map超过0.75的时候，将会创建原来两倍的bucket数组叫做rehash，并发情况下队尾会reverse到队首</p>
<p>(3)为什么使用Integer,String 作为wrapper合适<br>因为不可变性,而且String,Integer已经重写了hashcode和equals方法，碰撞概率低<br>(4)hashmap死循环可以做手势的方式演示出来</p>
<p>HashMap 和 HashTable、ConcurrentHashMap 的区别</p>
<p>(5)HashMap的遍历方式及效率<br>for(Entry)<br>for(key:keySet)//其实是遍历了两次</p>
<p>(6)HashMap、LinkedHashMap、TreeMap的区别<br>TreeMap:红黑树<br>LinkedHashMap:<br>排序二叉树:<br>红黑树:</p>
<p>(7)如何决定选用HashMap还是TreeMap<br>Collections.synchronizedMap</p>
<p>如果HashMap的大小超过了负载因子(load factor)定义的容量，怎么办<br>(8)HashMap 是线程安全的吗？并发下使用的 Map 是什么，它们内部原理分别是什么，比如存储方式、 hashcode、扩容、 默认容量等<br>ConcurrentHashMap扩容<br>put会上锁 scanAndLockForPut</p>
<p>(9)WeakHashMap 是怎么工作的？<br>如果map中的key指向null，调用system.gc能立马回收掉<br>WeakHashMap使用的Entry继承了weakReference,如果entry不再被引用，那么他就会进入到ReferenceQueue中，然后gc，就会把entry清理掉<br>WeakHashMap和HashMap:addEntry原理: key,value依旧和传进来的key,value是同一个对象<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//WeakHashMap相同</span></div><div class="line">HashMap&lt;ComparableClass,String&gt; map = <span class="keyword">new</span> HashMap&lt;&gt;();</div><div class="line">        map.put(c1,<span class="string">"aa"</span>);</div><div class="line">        map.put(c2,<span class="string">"bb"</span>);</div><div class="line">        c1 = <span class="keyword">null</span>;</div><div class="line">        System.out.println(map.get(c1));<span class="comment">//null</span></div></pre></td></tr></table></figure></p>
<p>(10)Set 里的元素是不能重复的，那么用什么方法来区分重复与否呢？是用 == 还是 equals()？ 它们有何区别?<br>TreeSet，HashSet这些都是内部实现的是Map，其实就是保证map的key不重复，<br>(11)TreeMap和TreeSet在排序时如何比较元素？Collections工具类中的sort()方法如何比较元素？<br>TreeMap要想put必须先实现comparable接口重写compareTo方法<br>Map<string,string> map = new TreeMap&lt;&gt;(new Comparator<string>(){<br>    public int compare(String o1,String o2){<br>        return o2.compareTo(o1);<br>    }<br>});<br>Collections.sort(list,new Comparator) 实现compare</string></string,string></p>
<p>(12)TreeSet：一个已经构建好的 TreeSet，怎么完成倒排序。</p>
<p>(13)EnumSet 是什么<br>Set<enumq> s = Collections.synchronizedSet(EnumSet.noneOf(EnumQ.class));<br>(14)Hash算法</enumq></p>
<p>Hashcode 的作用</p>
<p>为什么在重写 equals 方法的时候需要重写 hashCode 方法？equals与 hashCode 的异同点在哪里<br>(1) 相等的对象必须要有相同的hashcode<br>(2) equals相等 （equals的内部实现 == ）</p>
<p>hashCode() 和 equals() 方法的重要性体现在什么地方</p>
<p>如何在父类中为子类自动完成所有的 hashcode 和 equals 实现？这么做有何优劣。</p>
<p>LinkedHashMap 和 PriorityQueue 的区别是什么<br>LinkedHashMap:LRU算法是LinkedHashMap本身通过双向链，将最近使用的内容放到链表头，可以指定大小进行remove<br>PriorityQueue:</p>
<p>List, Set, Map 是否继承自 Collection 接口<br>遍历一个 List 有哪些不同的方式</p>
<p>LinkedList 双向链表:poll先进先出</p>
<p>插入数据时，ArrayList, LinkedList, Vector谁速度较快？</p>
<p>Vector 过时，直接Collections.synchronizedList(list)</p>
<p>ArrayList （默认10）和 HashMap（默认16）</p>
<p>Array可以存基本类型</p>
<p>说出ArrayList,Vector, LinkedList的存储性能和特性<br>对于在Map中插入、删除和定位元素这类操作，HashMap是最好的选择。然而，假如你需要对一个有序的key集合进行遍历，TreeMap是更好的选择。基于你的collection的大小，也许向HashMap中添加元素会更快，将map换为TreeMap进行有序key的遍历。<br>Vector是同步的，而ArrayList不是。然而，如果你寻求在迭代的时候对列表进行改变，你应该使用CopyOnWriteArrayList。<br>LinkedList</p>
<p>Map, Set, List, Queue, Stack<br>Map 接口提供了哪些不同的集合</p>
<p>为什么 Map 接口不继承 Collection 接口<br>1.要从他的接口来说，数据结构，提供的方法<br>Collections.remove(object) Map是通过remove(key)</p>
<p>介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些</p>
<p>为什么 Collection 不从 Cloneable 和 Serializable 接口继承</p>
<p>copyonwritearraylist线程安全的list，通过底层进行数组复制，然后修改</p>
<p>Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别</p>
<p>Vector所有方法都是用synchronized修饰的（已经不推荐使用了，性能低）<br>(1)Collections.synchronizedList 来 包裹 ArrayList (同步代码块)<br>(2)Stack继承了Vector，对pop(),push(),peek()都是在Vector基础上实现的<br>(3)vector一直在加锁释放锁，每次都是同步list，synchronizedList只是给mutex互斥量加锁</p>
<p>?? Object：Object有哪些公用方法？Object类hashcode,equals 设计原则？ sun为什么这么设计？Object类的概述<br>hashcode<br>equals<br>getClass<br>notify<br>wait</p>
<p>—– 2017-11-27</p>
<h3 id="什么是-B-树，B-树，列出实际的使用场景"><a href="#什么是-B-树，B-树，列出实际的使用场景" class="headerlink" title="什么是 B+树，B-树，列出实际的使用场景"></a>什么是 B+树，B-树，列出实际的使用场景</h3><p>B+树：mysql索引<br>B-(B)树：</p>
<p>Comparator 与 Comparable 接口是干什么的？列出它们的区别</p>
<p>拷贝(clone)</p>
<p>如何实现对象克隆<br>深拷贝和浅拷贝区别<br>深拷贝和浅拷贝如何实现激活机制<br>写clone()方法时，通常都有一行代码，是什么<br>比较</p>
<p>在比较对象时，”==” 运算符和 equals 运算有何区别<br>如果要重写一个对象的equals方法，还要考虑什么<br>两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对</p>
<p>构造器链是什么:Child是Person对象，也是Object对象，如果创建Child对象，也同时是创建Person，Object对象</p>
<p>创建对象时构造器的调用顺序:</p>
<p>什么是不可变象（immutable object)：实例的值不能发生变化</p>
<p>为什么 Java 中的 String 是不可变的：<br>You can share duplicates by pointing them to a single instance. 常量池共享数据，因为数据不会变</p>
<p>如何构建不可变的类结构？关键点在哪里</p>
<p>能创建一个包含可变对象的不可变对象吗</p>
<p>CopyOnWriteArrayList and synchronizedList</p>
<p>是的，我们是可以创建一个包含可变对象的不可变对象的，</p>
<p>你只需要谨慎一点，不要共享可变对象的引用就可以了，如果需要变化时，</p>
<p>就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。</p>
<h3 id="如何对一组对象进行排序"><a href="#如何对一组对象进行排序" class="headerlink" title="如何对一组对象进行排序"></a>如何对一组对象进行排序</h3><p>abstract 的 method是否可同时是 static，是否可同时是 native，是否可同时是synchronized</p>
<p>Java支持哪种参数传递类型<br>当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递</p>
<h3 id="GC"><a href="#GC" class="headerlink" title="GC"></a>GC</h3><p>概念</p>
<p>GC是什么？为什么要有GC<br>什么时候会导致垃圾回收<br>GC是怎么样运行的<br>新老以及永久区是什么<br>GC 有几种方式？怎么配置<br>什么时候一个对象会被GC？ 如何判断一个对象是否存活<br>System.gc() Runtime.gc()会做什么事情？ 能保证 GC 执行吗<br>垃圾回收器可以马上回收内存吗？有什么办法主动通知虚拟机进行垃圾回收？<br>Minor GC 、Major GC、Young GC 与 Full GC分别在什么时候发生<br>垃圾回收算法的实现原理<br>如果对象的引用被置为null，垃圾收集器是否会立即释放对象占用的内存？<br>垃圾回收的最佳做法是什么<br>GC收集器有哪些</p>
<p>垃圾回收器的基本原理是什么？<br>串行(serial)收集器和吞吐量(throughput)收集器的区别是什么<br>Serial 与 Parallel GC之间的不同之处<br>CMS 收集器 与 G1 收集器的特点与区别<br>CMS垃圾回收器的工作过程<br>JVM 中一次完整的 GC 流程是怎样的？ 对象如何晋升到老年代<br>吞吐量优先和响应优先的垃圾收集器选择<br>GC策略</p>
<p>举个实际的场景，选择一个GC策略<br>JVM的永久代中会发生垃圾回收吗<br>收集方法</p>
<p>标记清除、标记整理、复制算法的原理与特点？分别用在什么地方<br>如果让你优化收集方法，有什么思路</p>
<h3 id="JVM"><a href="#JVM" class="headerlink" title="JVM"></a>JVM</h3><p>参数</p>
<p>说说你知道的几种主要的jvm 参数<br>-XX:+UseCompressedOops 有什么作用<br>压缩oop，节省一定的内存，使用32位的oop</p>
<p>简述重排序，内存屏障，happen-before，主内存，工作内存</p>
<p>Java中存在内存泄漏问题吗？请举例说明</p>
<p>简述 Java 中软引用（SoftReference）、弱引用（WeakReference）和虚引用</p>
<p>内存映射缓存区是什么</p>
<p>jstack，jstat，jmap，jconsole怎么用<br><a href="https://www.ydt.com.cn/h/lpqUlW1llXDEYceXlJqSmZVnl2SdapZk.html" target="_blank" rel="external">https://www.ydt.com.cn/h/lpqUlW1llXDEYceXlJqSmZVnl2SdapZk.html</a></p>
<p>32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数？32 位和 64 位的 JVM，int 类型变量的长度是多数？</p>
<p>JVM自身会维护缓存吗？是不是在堆中进行对象分配，操作系统的堆还是JVM自己管理堆<br>会维护缓存，JVM自身维护的堆</p>
<p>什么情况下会发生栈内存溢出<br>递归的时候，栈不断产生新的变量</p>
<p>双亲委派模型是什么<br>加载类，需要交给父类加载器加载，比如说一个类Object一定要交给BootstrapClassLoader来加载，同一个加载器加载出来的类才算是同类型的类</p>
<p>Java中notify 和 notifyAll有什么区别？<br>notify()方法不能唤醒某个具体的线程,只有一个线程在等待的时候它才有用武之地<br>notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行</p>

      
    </div>

    <div>
      
        

      
    </div>

    <div>
      
        
  <div style="padding: 10px 0; margin: 20px auto; width: 90%; text-align: center;">
    <div>坚持原创技术分享，您的支持将鼓励我继续创作！</div>
    <button id="rewardButton" disable="enable" onclick="var qr = document.getElementById('QR'); if (qr.style.display === 'none') {qr.style.display='block';} else {qr.style.display='none'}">
      <span>赏</span>
    </button>
    <div id="QR" style="display: none;">
      
        <div id="wechat" style="display: inline-block">
          <img id="wechat_qr" src="/uploads/wechat.png" alt="罗天翔 WeChat Pay"/>
          <p>微信打赏</p>
        </div>
      
      
        <div id="alipay" style="display: inline-block">
          <img id="alipay_qr" src="/uploads/ali.jpg" alt="罗天翔 Alipay"/>
          <p>支付宝打赏</p>
        </div>
      
    </div>
  </div>


      
    </div>

    <div>
      
        

      
    </div>

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2017/07/14/java/技术问答3/" rel="next" title="技术问答3">
                <i class="fa fa-chevron-left"></i> 技术问答3
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2017/07/14/tool/shell/" rel="prev" title="shell">
                shell <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    
      <div id="SOHUCS"></div>
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/uploads/avatar.jpg"
               alt="罗天翔" />
          <p class="site-author-name" itemprop="name">罗天翔</p>
           
              <p class="site-description motion-element" itemprop="description">一次就把事情做对.</p>
          
        </div>
        <nav class="site-state motion-element">

          
            <div class="site-state-item site-state-posts">
              <a href="/archives/">
                <span class="site-state-item-count">73</span>
                <span class="site-state-item-name">日志</span>
              </a>
            </div>
          

          
            
            
            <div class="site-state-item site-state-categories">
              <a href="/categories/index.html">
                <span class="site-state-item-count">13</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          

        </nav>

        

        <div class="links-of-author motion-element">
          
            
              <span class="links-of-author-item">
                <a href="https://github.com/louiegit/" target="_blank" title="GitHub">
                  
                    <i class="fa fa-fw fa-github"></i>
                  
                  GitHub
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="" target="_blank" title="微信">
                  
                    <i class="fa fa-fw fa-wechat"></i>
                  
                  微信
                </a>
              </span>
            
          
        </div>

        
        

        
        

        


      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#基本概念"><span class="nav-number">1.</span> <span class="nav-text">基本概念</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#面试题"><span class="nav-number">1.1.</span> <span class="nav-text">面试题</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#关键字"><span class="nav-number">2.</span> <span class="nav-text">关键字</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#操作符"><span class="nav-number">3.</span> <span class="nav-text">操作符</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#数据结构"><span class="nav-number">4.</span> <span class="nav-text">数据结构</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#什么是-B-树，B-树，列出实际的使用场景"><span class="nav-number">5.</span> <span class="nav-text">什么是 B+树，B-树，列出实际的使用场景</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#如何对一组对象进行排序"><span class="nav-number">6.</span> <span class="nav-text">如何对一组对象进行排序</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#GC"><span class="nav-number">7.</span> <span class="nav-text">GC</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#JVM"><span class="nav-number">8.</span> <span class="nav-text">JVM</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2017</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">罗天翔</span>
</div>


<div class="powered-by">
  NBA & Code. What?
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Pisces
  </a>
</div>


        

        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.1"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.1"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.1"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.1"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.1"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.1"></script>



  


  




	





  





  





  




  
    <script type="text/javascript">
    (function(){
      var appid = 'cyt9ceIwz';
      var conf = 'c6226e2bfb7e9c65efc235736edc5074';
      var width = window.innerWidth || document.documentElement.clientWidth;
      if (width < 960) {
      window.document.write('<script id="changyan_mobile_js" charset="utf-8" type="text/javascript" src="https://changyan.sohu.com/upload/mobile/wap-js/changyan_mobile.js?client_id=' + appid + '&conf=' + conf + '"><\/script>'); } else { var loadJs=function(d,a){var c=document.getElementsByTagName("head")[0]||document.head||document.documentElement;var b=document.createElement("script");b.setAttribute("type","text/javascript");b.setAttribute("charset","UTF-8");b.setAttribute("src",d);if(typeof a==="function"){if(window.attachEvent){b.onreadystatechange=function(){var e=b.readyState;if(e==="loaded"||e==="complete"){b.onreadystatechange=null;a()}}}else{b.onload=a}}c.appendChild(b)};loadJs("https://changyan.sohu.com/upload/changyan.js",function(){
        window.changyan.api.config({appid:appid,conf:conf})});
      }
    })();
    </script>
    <script type="text/javascript" src="https://assets.changyan.sohu.com/upload/plugins/plugins.count.js"></script>
  




  





  

  
  <script src="https://cdn1.lncld.net/static/js/av-core-mini-0.6.1.js"></script>
  <script>AV.initialize("PITM8mBWsQN3SJFbzhc4ENjF-gzGzoHsz", "XDe54bE6K2j8dN2EzXkB7NzE");</script>
  <script>
    function showTime(Counter) {
      var query = new AV.Query(Counter);
      var entries = [];
      var $visitors = $(".leancloud_visitors");

      $visitors.each(function () {
        entries.push( $(this).attr("id").trim() );
      });

      query.containedIn('url', entries);
      query.find()
        .done(function (results) {
          var COUNT_CONTAINER_REF = '.leancloud-visitors-count';

          if (results.length === 0) {
            $visitors.find(COUNT_CONTAINER_REF).text(0);
            return;
          }

          for (var i = 0; i < results.length; i++) {
            var item = results[i];
            var url = item.get('url');
            var time = item.get('time');
            var element = document.getElementById(url);

            $(element).find(COUNT_CONTAINER_REF).text(time);
          }
          for(var i = 0; i < entries.length; i++) {
            var url = entries[i];
            var element = document.getElementById(url);
            var countSpan = $(element).find(COUNT_CONTAINER_REF);
            if( countSpan.text() == '') {
              countSpan.text(0);
            }
          }
        })
        .fail(function (object, error) {
          console.log("Error: " + error.code + " " + error.message);
        });
    }

    function addCount(Counter) {
      var $visitors = $(".leancloud_visitors");
      var url = $visitors.attr('id').trim();
      var title = $visitors.attr('data-flag-title').trim();
      var query = new AV.Query(Counter);

      query.equalTo("url", url);
      query.find({
        success: function(results) {
          if (results.length > 0) {
            var counter = results[0];
            counter.fetchWhenSave(true);
            counter.increment("time");
            counter.save(null, {
              success: function(counter) {
                var $element = $(document.getElementById(url));
                $element.find('.leancloud-visitors-count').text(counter.get('time'));
              },
              error: function(counter, error) {
                console.log('Failed to save Visitor num, with error message: ' + error.message);
              }
            });
          } else {
            var newcounter = new Counter();
            /* Set ACL */
            var acl = new AV.ACL();
            acl.setPublicReadAccess(true);
            acl.setPublicWriteAccess(true);
            newcounter.setACL(acl);
            /* End Set ACL */
            newcounter.set("title", title);
            newcounter.set("url", url);
            newcounter.set("time", 1);
            newcounter.save(null, {
              success: function(newcounter) {
                var $element = $(document.getElementById(url));
                $element.find('.leancloud-visitors-count').text(newcounter.get('time'));
              },
              error: function(newcounter, error) {
                console.log('Failed to create');
              }
            });
          }
        },
        error: function(error) {
          console.log('Error:' + error.code + " " + error.message);
        }
      });
    }

    $(function() {
      var Counter = AV.Object.extend("Counter");
      if ($('.leancloud_visitors').length == 1) {
        addCount(Counter);
      } else if ($('.post-title-link').length > 1) {
        showTime(Counter);
      }
    });
  </script>



  

  

  

  

  

</body>
</html>
